#include<iostream>
#define MAX "world"
extern void sun();

namespace wd{
    extern void sun();
    extern int num;
}
//宏定义和 常量区别
void test0(){
    std::cout<<MAX+2<<std::endl;
    const int num = 123;
    std::cout<<num<<std::endl;
 //   num  = 300;
}
//const 修饰指针
//1、修饰内容 ， 不能直接改内容（可以间接）
void test1 (){
    int ptr = 500,ptr1=600;
    const int*p=&ptr;
    std::cout<<"ptr:"<<*p<<std::endl;
    p = &ptr1;
   // *p = 100;
    std::cout<<"ptr:"<<*p<<std::endl;
}
//常量的指针
//2、修饰 指针 不能改指向，但是可以通过指针改内容
void test2(){
    int num=910,num2=890;
    int  *const p = &num;
    std:: cout<<"int const p:"<<*p<<std::endl;
    
  //  p = &num2;  const 靠近 p这个指针 就说明不能改变指向
  //  但是下面就可以  可以修改值

    num =300;
    *p = num2;
    std:: cout<<"int const p:"<<*p<<std::endl;

}
void test3(){
    int num2=800;
    const int  num = 100;  
//    num = 900;           num值不能直接改
    const int *p = &num;
    p = &num2;
 //   *p = 700;   
}
using namespace std;
//
int test4(){
    int arr [5]={2,9,3,4,5};
   //数组指针
    int *p = arr;
    cout<<"!!"<<*p<<endl;
    for(int i=0;i<5;i++){
        cout<<p[i]<<endl;
    }
    int (*ptr)[5] = &arr;
    for(int i=0;i<5;i++){
        cout<<(*ptr)[i]<<endl;
    }
    /*std::cout<<"arr:"<<*arr<<"&："<<*(arr+1)+1<<std::endl;
    for(int index = 0;index<=4;index++){
        cout<<"index: "<<(*arr)+index<<endl;
        cout<<"index: "<<arr[index]<<"[]"<<*(arr+index)<<endl;
    }*/
    //指针数组
    int num1 = 10,num2 = 30,num3 = 40;
    int *p1 = &num1,*p2 = &num2,*p3=&num3;
   // int arr1[4] = {p1,p2,p3};  错误写法 不是普通的int类型
   int *arr1[4] = {p1,p2,p3};
   for(int i=0;i<3;i++){
       cout<<"arr1:"<<*arr1[i]<<endl;
   }
    return 0;
}
//函数指针/指针函数
int func (int num,int num2){
    cout<<num<<" "<<num2<<endl;
    return 1;
}
void test5(){
    int (*f)(int,int)=func;
    cout<<f(1,2)<<endl;
     
    int (*f1)(int,int) = &func;
    cout<<(*f1)(4,5)<<endl;


}
int main(){
   // sun();
    //wd::sun();
    //std::cout<<wd::num<<std::endl;
test5();

}
